package com.nlx.notes.module.service.impl.system;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.nlx.notes.module.bean.dto.system.SystemConfigUpdateDTO;
import com.nlx.notes.module.bean.vo.system.SystemConfigVO;
import com.nlx.notes.module.core.consts.GlobalConst;
import com.nlx.notes.module.core.enums.error.SystemConfigCodeEnum;
import com.nlx.notes.module.core.util.AmountConverterUtils;
import com.nlx.notes.module.core.util.DataConvertorUtils;
import com.nlx.notes.module.entity.SystemPreferences;
import com.nlx.notes.module.mapper.SystemPreferencesMapper;
import com.nlx.notes.module.service.system.ISystemPreferencesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nlx.notes.support.handler.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * <p>
 * 用户的配置项信息 服务实现类
 * </p>
 *
 * @author nlx
 * @since 2025-08-24
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class SystemPreferencesServiceImpl extends ServiceImpl<SystemPreferencesMapper, SystemPreferences> implements ISystemPreferencesService {

    @Override
    public List<SystemConfigVO> getSystemConfigList(String type,Long userId) {
        List<SystemPreferences> systemPreferences = this.getBaseMapper().selectSystemConfigList(type,userId);
        if(CollUtil.isEmpty(systemPreferences)){
            return Collections.emptyList();
        }
        for (SystemPreferences systemPreference : systemPreferences) {
            if(GlobalConst.SystemConfig.USER_MONTH_BUDGET.equals(systemPreference.getPrefKey())){
                systemPreference.setPrefValue(AmountConverterUtils.convertFenToYuan(Integer.parseInt(systemPreference.getPrefValue())));
            }
        }
        return DataConvertorUtils.copyListProperties(systemPreferences,SystemConfigVO::new);
    }

    @Override
    public String findValueByKey(Long userId, String key) {
        SystemPreferences preferences = findByKey(userId, key);
        if(null != preferences){
            return preferences.getPrefValue();
        }
        return null;
    }

    @Override
    public SystemConfigVO updateConfigConfig(SystemConfigUpdateDTO systemConfigUpdateDTO) {
        SystemPreferences systemPreferences = new SystemPreferences();
        SystemPreferences preferences = this.findByKey(systemConfigUpdateDTO.getUserId(), systemConfigUpdateDTO.getPrefKey());
        if(null == preferences){
            if(GlobalConst.SystemConfig.USER_MONTH_BUDGET.equals(systemConfigUpdateDTO.getPrefKey())){
                systemPreferences.setPrefValue(String.valueOf(AmountConverterUtils.convertYuanToFen(systemConfigUpdateDTO.getPrefValue())));
                systemPreferences.setPrefKey(GlobalConst.SystemConfig.USER_MONTH_BUDGET);
                systemPreferences.setUserId(systemConfigUpdateDTO.getUserId());
                systemPreferences.setCreatedTime(LocalDateTime.now());
                systemPreferences.setDelFlag(GlobalConst.DEL_FLAG_NORMAL);
                this.save(systemPreferences);
                return DataConvertorUtils.copyProperties(systemPreferences,SystemConfigVO::new);
            }
            log.error("未找到对应的配置");
            throw new BusinessException(SystemConfigCodeEnum.SYSTEM_CONFIG_KEY_NOT_EXISTS);
        }

        systemPreferences.setId(preferences.getId());
        systemPreferences.setPrefKey(systemConfigUpdateDTO.getPrefKey());
        systemPreferences.setUserId(systemConfigUpdateDTO.getUserId());
        systemPreferences.setUpdatedTime(LocalDateTime.now());
        if(GlobalConst.SystemConfig.USER_MONTH_BUDGET.equals(systemConfigUpdateDTO.getPrefKey())){
            systemPreferences.setPrefValue(String.valueOf(AmountConverterUtils.convertYuanToFen(systemConfigUpdateDTO.getPrefValue())));
        }
        this.updateById(systemPreferences);
        SystemConfigVO systemConfigVO = DataConvertorUtils.copyProperties(systemPreferences, SystemConfigVO::new);
        systemConfigVO.setPrefValue(systemConfigUpdateDTO.getPrefValue());
        return systemConfigVO;
    }

    private SystemPreferences findByKey(Long userId, String key) {
        if(StrUtil.isEmpty(key)){
            return null;
        }
        SystemPreferences systemPreferences = this.getBaseMapper().selectOne(Wrappers.lambdaQuery(SystemPreferences.class)
                .eq(SystemPreferences::getUserId, userId).eq(SystemPreferences::getPrefKey, key)
                .eq(SystemPreferences::getDelFlag, GlobalConst.DEL_FLAG_NORMAL), false);
        if(null != systemPreferences){
            return systemPreferences;
        }
        return null;

    }
}
